Server-Sent Events (SSE) va WebSockets kabi Frontend Oqim APILarini o'rganing. Ular real-vaqtda ma'lumotlarni yangilash, foydalanuvchi jalb etishni kuchaytirish va global auditoriya uchun dinamik veb-ilovalar yaratish imkonini qanday berishini bilib oling.
Frontend Oqim APILari: SSE va WebSockets yordamida Real-Vaqt Foydalanuvchi Tajribalarini Yaratish
Bugungi tez rivojlanayotgan raqamli landshaftda foydalanuvchilar statik kontentdan ko'prog'ini kutishadi. Ular dinamik, interaktiv va real vaqtdagi tajribalarni xohlashadi. Bu jonli aksiya tikeri, oniy chat xabarlari yoki doimiy yangilanib turadigan yangiliklar lentasi bo'ladimi, serverdan klientga ma'lumotlarni uzluksiz yuborish qobiliyati endi hashamat emas, balki zaruratdir. Aynan shu yerda frontend oqim APILari ishga tushib, bizning sezgir va jozibali veb-ilovalarni yaratish usulimizni inqilob qiladi. Eng mashhur va kuchli oqim texnologiyalaridan ikkitasi Server-Sent Events (SSE) va WebSocketsdir. Ushbu keng qamrovli qo'llanmada ularning nima ekanligi, qanday ishlashi, qo'llanilish holatlari va global loyihalaringiz uchun to'g'risini qanday tanlash kerakligi haqida chuqur ma'lumot beriladi.
Real-Vaqt Ma'lumotlariga Bo'lgan Ehtiyoj
An'anaviy veb-dasturlash ko'pincha so'rov-javob modeliga tayanadi. Klient (brauzer) serverga so'rov yuboradi va server javob qaytaradi. Ushbu model HTTP uchun asos bo'lsa-da, real vaqtda yangilanishlarni yetkazib berishda uning cheklovlari mavjud. Real vaqtga yaqin yangilanishlarga erishish uchun dasturchilar ko'pincha polling (so'rovnoma) kabi texnikalarga murojaat qilishadi, bunda klient serverdan yangi ma'lumotlar bor-yo'qligini qayta-qayta so'raydi. Biroq, polling samarasiz, keraksiz tarmoq o'tkazuvchanligini sarflaydi va ehtiyotkorlik bilan amalga oshirilmasa, kechikishlarga olib kelishi mumkin. Bu xuddi kimdir uyda ekanligini bilish uchun eshikni doimiy taqillatishga o'xshaydi, ular kelganida xabardor bo'lish o'rniga.
Real-vaqt imkoniyatlariga bo'lgan talab turli xil dastur ehtiyojlaridan kelib chiqadi:
- Oniy Xabarnomalar: Foydalanuvchilarni yangi xabarlar, yangilanishlar yoki tizim hodisalari sodir bo'lganda ogohlantirish.
- Jonli Lentalar: Ijtimoiy tarmoqlar lentalari, yangiliklar tikeri yoki sport natijalari kabi tez-tez o'zgarib turadigan dinamik kontentni ko'rsatish.
- Hamkorlikdagi Ilovalar: Bir vaqtning o'zida bir nechta foydalanuvchiga bir xil ma'lumotlar bilan o'zaro ishlash imkonini berish, masalan, real vaqtda hujjat tahrirlash yoki ko'p o'yinchili o'yinlarda.
- IoT Ma'lumotlarini Vizualizatsiya Qilish: Real vaqtda monitoring va tahlil qilish uchun sensorlar va qurilmalardan ma'lumotlar oqimini uzatish.
Ushbu ehtiyojlarni samarali hal qilish uchun frontend oqim APILari yanada samaraliroq va to'g'ridan-to'g'ri aloqa kanalini taklif qiladi, bu esa serverlarga klient har bir alohida so'rovni boshlamasdan ma'lumotlarni yuborish imkonini beradi.
Server-Sent Events (SSE)ni Tushunish
Server-Sent Events (SSE) - bu veb-serverga bitta, uzoq muddatli HTTP ulanishi orqali veb-klientga (brauzerga) ma'lumotlarni yuborish imkonini beruvchi standart texnologiya. Bu bir tomonlama aloqa protokoli bo'lib, server klientga ma'lumot yuboradi, ammo klient xuddi shu SSE ulanishi orqali serverga ma'lumot qaytara olmaydi. Ikki tomonlama aloqa uchun alohida HTTP so'rovi yoki WebSockets kabi boshqa protokol kerak bo'ladi.
SSE Qanday Ishlaydi
SSE mavjud HTTP protokoliga tayanadi. Klient SSE endpointiga so'rov yuborganida, server HTTP ulanishini ochiq holda saqlaydi. Javob yuborgandan so'ng ulanishni yopish o'rniga, server ma'lumotlarni maxsus `text/event-stream` formatida yuborishda davom etadi. Bu format quyidagilarni o'z ichiga olgan oddiy, matnga asoslangan protokoldir:
- `data:`: Haqiqiy ma'lumotlar yuki. U bir nechta qatorga yoyilishi mumkin, har bir qator oldidan `data: ` qo'yiladi.
- `event:`: Hodisa turini belgilash uchun ixtiyoriy maydon. Bu klientlarga ma'lum hodisa turlarini tinglash imkonini beradi.
- `id:`: Hodisa uchun ixtiyoriy noyob identifikator, bu klientga ulanish uzilib qolsa, qayta ulanishga yordam beradi.
- `retry:`: Millisekundlarda qayta ulanish intervalini belgilash uchun ixtiyoriy maydon.
Bo'sh qator hodisaning tugashini bildiradi. Brauzerning mahalliy `EventSource` APIsi frontendda SSE bilan ishlashni juda osonlashtiradi. U ulanishni boshqarish, xabarlarni tahlil qilish va xatoliklarni qayta ishlash, jumladan qayta ulanish urinishlarini avtomatik ravishda boshqaradi.
Frontendda SSE (JavaScript Misoli)
Quyida JavaScriptda SSE oqimini qanday qabul qilishning asosiy misoli keltirilgan:
const eventSource = new EventSource('/your-sse-endpoint');
eventSource.onmessage = function(event) {
console.log('Xabar qabul qilindi:', event.data);
// UI'ingizni event.data bilan yangilang
};
// Maxsus hodisa turlarini qayta ishlash
eventSource.addEventListener('userUpdate', function(event) {
const userData = JSON.parse(event.data);
console.log('Foydalanuvchi yangilandi:', userData);
// Foydalanuvchi profili ko'rinishini yangilang
});
// Xatoliklarni qayta ishlash
eventSource.onerror = function(err) {
console.error('EventSource xatosi:', err);
eventSource.close(); // Jiddiy xatolik yuzaga kelsa, ulanishni yoping
};
// Ixtiyoriy: Ulanish ochilganini qayta ishlash
eventSource.onopen = function() {
console.log('SSE ulanishi ochildi');
};
SSE'ning Asosiy Xususiyatlari va Afzalliklari
- Soddalik: HTTP ustiga qurilganligi sababli, uni amalga oshirish va mavjud infratuzilmaga integratsiya qilish oson. Fayrvollar va proksilar odatda HTTP ulanishlarini muammosiz qo'llab-quvvatlaydi.
- Brauzerda Mahalliy Qo'llab-quvvatlash: `EventSource` API barcha zamonaviy brauzerlar tomonidan mahalliy ravishda qo'llab-quvvatlanadigan standart Veb API hisoblanadi.
- Avtomatik Qayta Ulanish: `EventSource` API ulanish uzilgan taqdirda avtomatik ravishda qayta ulanishga harakat qiladi.
- UTF-8 Matn Ma'lumotlari: SSE UTF-8 matnli ma'lumotlar uchun mo'ljallangan, bu JSON yoki oddiy matnli yuklarni yuborishni osonlashtiradi.
- Bir tomonlama oqimlar uchun samarali: Server klientga ma'lumotlarni yuborishi kerak bo'lgan, ammo klient tez-tez javob yuborishi shart bo'lmagan holatlar uchun ideal.
SSE'ning Cheklovlari
- Bir tomonlama: SSE faqat serverdan klientga aloqa uchun mo'ljallangan. Klientdan serverga aloqa alohida HTTP so'rovlarini talab qiladi.
- Ikkilik Ma'lumotlarni Qo'llab-quvvatlamaydi: SSE faqat matnga asoslangan ma'lumotlar uchun mo'ljallangan. Ikkilik ma'lumotlar oqimi uchun WebSockets yaxshiroq tanlovdir.
- Brauzer Ulanish Cheklovlari: HTTP/2 bilan bu muammo kamroq bo'lsa-da, eski brauzerlarda har bir domen uchun bir vaqtning o'zida ochiladigan HTTP ulanishlari sonida cheklovlar bo'lishi mumkin, bu ko'plab SSE ulanishlari bo'lgan ilovalarga ta'sir qilishi mumkin.
WebSocketsni Tushunish
WebSockets klient va server o'rtasida bitta, uzoq muddatli ulanish orqali to'liq dupleks aloqa kanalini ta'minlaydi. Bu shuni anglatadiki, ham klient, ham server bir-biriga istalgan vaqtda ma'lumot yuborishi mumkin, bu esa haqiqatan ham interaktiv, real vaqtdagi ilovalarni yaratishga imkon beradi. SSE'dan farqli o'laroq, WebSockets to'g'ridan-to'g'ri HTTP ustiga qurilmagan, balki ulanishni WebSocket protokoliga yangilash uchun dastlabki HTTP qo'l siqishidan (handshake) foydalanadi.
WebSockets Qanday Ishlaydi
WebSocket qo'l siqishi klientdan serverga standart HTTP so'rovi bilan boshlanadi, jumladan `Upgrade: websocket` va `Connection: Upgrade` kabi maxsus sarlavhalar. Agar server WebSocketsni qo'llab-quvvatlasa, u `HTTP/1.1 101 Switching Protocols` status kodi bilan javob beradi va ulanish yangilanadi. Shu nuqtadan boshlab, ulanish endi HTTP ulanishi emas, balki alohida protokol asosida ishlaydigan WebSocket ulanishidir.
O'rnatilgandan so'ng, WebSocket ulanishi ham matnli, ham ikkilik xabarlarni almashish imkonini beradi. Ushbu moslashuvchanlik uni oddiy chat interfeyslaridan tortib murakkab ko'p o'yinchili onlayn o'yinlargacha bo'lgan keng doiradagi ilovalar uchun mos qiladi.
Frontendda WebSockets (JavaScript Misoli)
Quyida JavaScriptda mahalliy `WebSocket` API'sidan foydalanishning asosiy misoli keltirilgan:
const websocket = new WebSocket('ws://your-websocket-server-url');
// Ulanish ochilganda
websocket.onopen = function(event) {
console.log('WebSocket ulanishi ochildi');
websocket.send('Salom Server!'); // Serverga xabar yuborish
};
// Serverdan xabar qabul qilinganda
websocket.onmessage = function(event) {
console.log('Serverdan xabar:', event.data);
// UI'ingizni event.data bilan yangilang
};
// Xatolik yuz berganda
websocket.onerror = function(event) {
console.error('WebSocket xatosi kuzatildi:', event);
};
// Ulanish yopilganda
websocket.onclose = function(event) {
if (event.wasClean) {
console.log(`WebSocket ulanishi toza yopildi, kod=${event.code} sabab=${event.reason}`);
} else {
console.error('WebSocket ulanishi uzildi');
}
};
// Ulanishni qo'lda yopish uchun
// websocket.close();
WebSocketsning Asosiy Xususiyatlari va Afzalliklari
- To'liq Dupleks Aloqa: Klient va server o'rtasida real vaqtda, ikki tomonlama ma'lumotlar almashinuvini ta'minlaydi.
- Past Kechikish: Ulanish o'rnatilgandan so'ng, xabarlarni yuborish va qabul qilish HTTP so'rovlariga qaraganda juda kam qo'shimcha yukka ega.
- Matn va Ikkilik Ma'lumotlarni Qo'llab-quvvatlash: Ham matnli, ham ikkilik ma'lumotlarni samarali uzata oladi, bu uni ko'p qirrali qiladi.
- Interaktiv Ilovalar uchun Samarali: Doimiy, ikki tomonlama aloqani talab qiladigan ilovalar uchun ideal.
WebSocketsning Cheklovlari
- Murakkablik: WebSocket serverlarini o'rnatish va boshqarish SSE'ga qaraganda murakkabroq bo'lishi mumkin, ko'pincha maxsus server dasturlari yoki kutubxonalarni talab qiladi.
- Proksi va Fayrvol Muammolari: Zamonaviy proksilar va fayrvollar WebSocketsni yaxshiroq boshqarsa-da, eski yoki noto'g'ri sozlanganlari hali ham muammolarni keltirib chiqarishi, potentsial ravishda WebSocket ulanishlarini bloklashi yoki ularga xalaqit berishi mumkin.
- O'rnatilgan Qayta Ulanish Yo'q: SSE'ning `EventSource`idan farqli o'laroq, mahalliy `WebSocket` API avtomatik ravishda qayta ulanishni boshqarmaydi. Bu mantiqni o'zingiz amalga oshirishingiz kerak.
- Xabarlarni Ramkalash/Buferlash Yo'q: WebSocket protokoli o'z-o'zidan xabarlarni ramkalash yoki buferlash kafolatlarini ta'minlamaydi, bu murakkab ma'lumotlar oqimlari uchun maxsus ishlov berishni talab qilishi mumkin.
SSE va WebSockets O'rtasida Tanlov
SSE va WebSockets o'rtasidagi tanlov sizning ilovangizning o'ziga xos talablariga bog'liq. Ikkalasi ham real vaqtdagi aloqa uchun kuchli vositalardir, ammo ular turli stsenariylarda ustunlik qiladi.
Server-Sent Events (SSE)ni Qachon Ishlatish Kerak:
- Bir tomonlama Ma'lumotlar Oqimi: Sizning asosiy ehtiyojingiz serverdan klientga ma'lumotlarni yuborish bo'lsa va klientdan serverga aloqa minimal bo'lsa yoki standart HTTP so'rovlari orqali amalga oshirilishi mumkin bo'lsa (masalan, forma ma'lumotlarini yuborish).
- Oddiy Xabarnomalar: Asosan jonli yangilanishlarni ko'rsatish kerak bo'lgan ilovalar uchun, masalan, aksiya narxlari, yangiliklar lentalari, sport natijalari yoki oddiy holat yangilanishlari.
- Amalga Oshirish Osonligi: Mavjud HTTP infratuzilmasidan foydalanadigan va qayta ulanish uchun o'rnatilgan brauzer qo'llab-quvvatlashini taklif qiladigan oddiyroq yechimni xohlasangiz.
- Matnga Asoslangan Ma'lumotlar: Ma'lumotlar yukingiz asosan matnli bo'lsa (JSON, XML, oddiy matn).
- Brauzer Moslashuvchanligi: SSE barcha zamonaviy brauzerlarda yaxshi qo'llab-quvvatlanadi.
SSE uchun Global Misollar:
- Barcha ulangan foydalanuvchilarga jonli aksiya narxlari yangilanishlarini yuboradigan moliyaviy yangiliklar veb-sayti.
- Tanlangan shahar uchun joriy harorat va ob-havo ma'lumotlarini doimiy ravishda yangilab turadigan ob-havo ilovasi.
- Operatsion boshqaruv paneliga tizim salomatligi monitoringi uchun real vaqtda ogohlantirishlar yuboradigan tizim.
- Barcha foydalanuvchi sessiyalarida sinxronlashtirilgan fles-savdo ortga hisoblash taymerlarini ko'rsatadigan elektron tijorat sayti.
WebSocketsni Qachon Ishlatish Kerak:
- Ikki tomonlama Ma'lumotlar Oqimi: Ham klient, ham server bir-biriga tez-tez va past kechikish bilan ma'lumot yuborishi kerak bo'lganda.
- Interaktiv Ilovalar: Real vaqtdagi chat ilovalari, hamkorlikdagi tahrirlash vositalari (Google Docs kabi), onlayn o'yinlar yoki jonli auksionlar uchun.
- Ikkilik Ma'lumotlarni Uzatish: Tasvirlar, audio yoki video oqimlari kabi ikkilik ma'lumotlarni yuborishingiz kerak bo'lganda.
- Past Kechikish Muhim Bo'lganda: Har bir millisekund muhim bo'lgan ilovalar uchun, masalan, yuqori chastotali savdo platformalari yoki raqobatbardosh onlayn o'yinlar.
WebSockets uchun Global Misollar:
- Foydalanuvchilarga real vaqtda xabarlarni yuborish va qabul qilish imkonini beruvchi global oniy xabarlashuv xizmati (WhatsApp yoki Telegram kabi).
- Turli qit'alardagi taqsimlangan jamoalar tomonidan aqliy hujum sessiyalari uchun ishlatiladigan hamkorlikdagi oq doska ilovasi.
- O'yinchilar bir-biri va o'yin serveri bilan real vaqtda o'zaro aloqada bo'ladigan onlayn ko'p o'yinchili o'yin.
- Tomoshabinlarga translyatsiya qiluvchiga real vaqtda chat xabarlari va smayliklarni yuborish imkonini beradigan jonli efir platformasi.
SSE va WebSocketsdan Tashqari: Boshqa Real-Vaqt Yondashuvlari
SSE va WebSockets asosiy o'yinchilar bo'lsa-da, boshqa real vaqtga yaqin texnikalarni, ayniqsa kontekst uchun yoki kengroq arxitektura naqshlarini ko'rib chiqishda eslatib o'tishga arziydi:
Long Polling (Uzoq So'rovnoma)
Uzoq so'rovnomada klient serverga so'rov yuboradi va server yangi ma'lumot yuborguncha yoki taymaut sodir bo'lguncha ulanishni ochiq holda ushlab turadi. Klient ma'lumot yoki taymaut olgach, darhol boshqa so'rov yuboradi. Bu qisqa so'rovnomadan samaraliroq, lekin har bir so'rov va javob sikli bilan bog'liq qo'shimcha yukni o'z ichiga oladi.
WebRTC (Web Real-Time Communication)
WebRTC - bu brauzerlar o'rtasida to'g'ridan-to'g'ri peer-to-peer (tengdoshlararo) aloqani ta'minlaydigan, ma'lumotlarni uzatish uchun markaziy server orqali o'tishni talab qilmaydigan (garchi ulanishlarni o'rnatish uchun signalizatsiya serveri kerak bo'lsa ham) yanada ilg'or freymvorkdir. U asosan real vaqtdagi audio va video oqimlari, shuningdek peer-to-peer ma'lumotlar almashinuvi uchun ma'lumot kanallari uchun ishlatiladi. Kuchli bo'lishiga qaramay, oddiyroq ma'lumotlar oqimi ehtiyojlari uchun uni amalga oshirish odatda SSE yoki standart WebSocketsdan murakkabroq.
HTTP/2 Server Push
HTTP/2 o'zi multiplekslash va sarlavhalarni siqish kabi xususiyatlarni taklif qiladi, bu esa umumiy veb unumdorligini yaxshilaydi. Server Push serverga klient so'ramasdan oldin, klientga kerak bo'lishini taxmin qilgan resurslarni proaktiv ravishda yuborish imkonini beradi. Resurslarni yuklashni optimallashtirish uchun foydali bo'lsa-da, bu dinamik ma'lumotlar yangilanishlari uchun SSE yoki WebSockets kabi umumiy maqsadli oqim API emas.
Oqim APILarini Global Kontekstda Amalga Oshirish
Global auditoriya uchun real vaqtdagi ilovalarni yaratishda bir nechta omillarni diqqat bilan ko'rib chiqish kerak:
Infratuzilma va Masshtablashuvchanlik
Dunyo bo'ylab potentsial millionlab foydalanuvchilar uchun doimiy ulanishlarni saqlash mustahkam server infratuzilmasini talab qiladi. Quyidagilarni ko'rib chiqing:
- Yukni Balanslash: Kiruvchi ulanishlarni bir nechta serverlar bo'ylab taqsimlash.
- Geografik Tarqatish: Dunyo bo'ylab foydalanuvchilar uchun kechikishni kamaytirish uchun serverlarni turli mintaqalarda joylashtirish.
- Ulanishni Boshqarish: Server tomonida samarali ulanishni boshqarishni amalga oshirish. Socket.IO (WebSocketsni abstrakt qiladigan va zaxira variantlarni taqdim etadigan) yoki maxsus WebSocket serverlari kabi kutubxonalar yordam berishi mumkin.
Tarmoq Sharoitlari va Kechikish
Internet tezligi va tarmoq barqarorligi butun dunyoda sezilarli darajada farq qiladi. Sizning amalga oshirishingiz barqaror bo'lishi kerak:
- To'g'ri Ishdan Chiqish: Agar real vaqtdagi ulanish muvaffaqiyatsiz bo'lsa, ilovaning hali ham ishlashi mumkinligini ta'minlang, ehtimol kamroq real vaqtdagi usullarga qaytish yoki foydalanuvchiga aniq fikr-mulohaza berish orqali.
- Ma'lumotlarni Serializatsiya Qilish: Ayniqsa sekin tarmoqlarda yuk hajmini minimallashtirish va uzatish tezligini yaxshilash uchun samarali ma'lumot formatlarini (masalan, WebSockets uchun Protocol Buffers yoki MessagePack) tanlang.
- Yurak Urishlari (Heartbeats): O'lik ulanishlarni aniqlash va ularning toza yopilishini ta'minlash uchun tiriklikni saqlovchi xabarlarni (heartbeats) amalga oshiring.
Xavfsizlik Masalalari
Xavfsiz aloqa birinchi darajali ahamiyatga ega:
- WSS (WebSocket Secure): HTTP uchun `https://` kabi, trafikni shifrlash uchun WebSocket ulanishlari uchun har doim `wss://` dan foydalaning.
- HTTPS orqali SSE: Xuddi shunday, SSE endpointlari uchun HTTPSdan foydalaning.
- Autentifikatsiya va Avtorizatsiya: Faqat autentifikatsiyadan o'tgan foydalanuvchilar oqim ulanishlarini o'rnatishi va maxfiy ma'lumotlarni qabul qilishi mumkinligini ta'minlang. Bu ko'pincha dastlabki ulanish qo'l siqishuvi paytida yoki birinchi xabar bilan autentifikatsiya tokenlarini uzatishni o'z ichiga oladi.
Brauzerlararo va Platformalararo Moslashuvchanlik
Zamonaviy brauzerlar SSE va WebSocketsni a'lo darajada qo'llab-quvvatlasa-da, frontend kodingiz mustahkam ekanligiga ishonch hosil qiling:
- Polifillar va Kutubxonalar: Eski brauzerlar yoki maxsus muhitlar uchun Socket.IO kabi kutubxonalar zaxira variantlar va izchil APIlarni taqdim etishi mumkin.
- Testlash: Real vaqtdagi xususiyatlaringizni keng doiradagi brauzerlar, qurilmalar va operatsion tizimlarda sinchkovlik bilan sinab ko'ring.
Xulosa
Frontend oqim APILari, xususan Server-Sent Events va WebSockets, zamonaviy, dinamik va jozibador veb-ilovalarni yaratish uchun muhim vositalardir. Ular dasturchilarga an'anaviy so'rov-javob modellarining cheklovlaridan tashqariga chiqish va foydalanuvchilar kutadigan boy, real vaqtdagi tajribalarni taqdim etish imkonini beradi.
Server-Sent Events (SSE) bir tomonlama ma'lumotlar oqimi uchun sodda, HTTP asosidagi yechimni taklif qiladi, bu soddalik va mahalliy brauzer qo'llab-quvvatlashi muhim bo'lgan bildirishnomalar va jonli yangilanishlar uchun ideal. Uning amalga oshirish osonligi va mustahkam xatoliklarni qayta ishlashi uni ko'plab keng tarqalgan real vaqtdagi stsenariylar uchun afzal tanlovga aylantiradi.
WebSockets esa, doimiy, past kechikishli, ikki tomonlama ma'lumotlar almashinuvini, shu jumladan ikkilik ma'lumotlarni uzatishni talab qiladigan yuqori interaktiv ilovalar uchun mukammal bo'lgan kuchli, to'liq dupleks aloqa kanalini ta'minlaydi. Boshqarish uchun potentsial ravishda murakkabroq bo'lsa-da, uning ko'p qirraliligi talabchan real vaqtdagi foydalanish holatlari uchun tengsizdir.
Har bir texnologiyaning kuchli va zaif tomonlarini tushunib, global infratuzilma, tarmoq sharoitlari va xavfsizlikni diqqat bilan hisobga olgan holda, siz SSE va WebSocketsdan samarali foydalanib, butun dunyo auditoriyasiga yoqadigan jozibali real vaqtdagi foydalanuvchi tajribalarini yaratishingiz mumkin. Veb-dasturlash kelajagi tobora ko'proq real vaqtga asoslanmoqda va ushbu oqim APILarini o'zlashtirish - bu o'zgarishlardan oldinda bo'lishning muhim qadamidir.